﻿using ProyectoDeTesis.Modelos.Filtros;
using ProyectoDeTesis.Modelos.Util;
using System;
using System.Collections.Generic;
using System.Linq;
using Telerik.WinControls.UI;

namespace ProyectoDeTesis.Controladores
{
    public class PersonalController
    {
        public string NO_DISPONIBLE = "El usuario no se encuentra disponible";
        public string USUARIO_CREADO = "El usuario se creo satisfactoriamente ";
        public string ERROR_CREADO = "Hubo un error durante la creación, intente de nuevo";
        public string SESION_CORRECTO = "Se inicio la sesión correctamente";
        public string CONTRASENHA_INCORRECTA = "La contraseña es incorrecta, intente de nuevo";
        public string CAMBIO_CONTRASENHA_CORRECTO = "Se cambió la contraseña exitosamente";
        public string CONFIRMACION_CONTRASENHA_INCORRECTA = "La confirmación no coincide con la contraseña";
        public string CONTRASENHA_OLVIDO_CORRECTO = "Se cambio la contraseña correctamente";
        private PerfilController perfilController = new PerfilController();
        
        public List<PerfilPersonal> buscarTodosPerfiles(FiltroPersonal filtroPersonal)
        {
            List<PerfilPersonal> resultado = null;

            try
            {
                var db = new Bd_tesisDataContext();
                var query = from c in db.PerfilPersonal
                            join user in db.Usuario on c.usuario_id equals user.id
                            where c.estado == "Activo"
                            select c;

                if (!String.IsNullOrEmpty(filtroPersonal.usuario))
                {
                    query = query.Where(x => x.Usuario.nombre_usuario.Contains(filtroPersonal.usuario));
                }

                if (!String.IsNullOrEmpty(filtroPersonal.apellido_materno))
                {
                    query = query.Where(x => x.ap_materno.Contains(filtroPersonal.apellido_materno));
                }
                if (!String.IsNullOrEmpty(filtroPersonal.apellido_paterno))
                {
                    query = query.Where(x => x.ap_paterno.Contains(filtroPersonal.apellido_paterno));
                }
                if (filtroPersonal.perfil_id > 0)
                {
                    query = query.Where(x => x.Usuario.perfil_id == filtroPersonal.perfil_id);
                }

                resultado = query.ToList();
               
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }

            return resultado;
        }

        public Usuario buscarUsuariosxNombre(string nombreUsuario)
        {
            Usuario usuario = null;

            try
            {
                var db = new Bd_tesisDataContext();
                var query = from c in db.Usuario
                            where (c.nombre_usuario == nombreUsuario)
                            select c;
                usuario = query.ToList().First();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            return usuario;
        }

        public string nuevoUsuario(PerfilPersonal perfil, Usuario user)
        {            
            try
            {                
                if (validarDisponibilidadUsuario(user.nombre_usuario))
                {
                    return NO_DISPONIBLE;
                }

                var db = new Bd_tesisDataContext();
                Usuario u = new Usuario();
                u.nombre_usuario = user.nombre_usuario;
                u.perfil_id = user.perfil_id;
                GeneradorLogin generadorLogin = new GeneradorLogin();
                string contrasena = generadorLogin.getPassword();
                u.contrasenha_nueva = contrasena;
                u.contrasenha_antigua = contrasena;
                db.Usuario.InsertOnSubmit(u);
                db.SubmitChanges();

                var query = from c in db.Usuario
                            orderby c.id descending
                            select c.id;

                int idUsuarioInsertado = query.ToList().First();

                PerfilPersonal p = new PerfilPersonal();
                p.nombre = perfil.nombre;
                p.telefono = perfil.telefono;
                p.ap_materno = perfil.ap_materno;
                p.ap_paterno = perfil.ap_paterno;
                p.correo = perfil.correo;
                p.direccion = perfil.direccion;
                p.fecha_nac = perfil.fecha_nac;
                p.estado = "Activo";
                p.usuario_id = idUsuarioInsertado;
                db.PerfilPersonal.InsertOnSubmit(p);
                db.SubmitChanges();

                Correo correo = new Correo();
                correo.enviarCorreoCreacionCuenta(u, p);
                return USUARIO_CREADO;

            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
                return ERROR_CREADO;
            }
        }

        private bool validarDisponibilidadUsuario(string nombre)
        {
            bool flag = false;

            try
            {
                var db = new Bd_tesisDataContext();
                var query = from c in db.Usuario
                            where (c.nombre_usuario == nombre)
                            select c;
                int result = query.ToList().Count();
                if (result > 0)
                {
                    flag = true;
                }
                else
                {
                    flag = false;
                }

            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());

            }

            return flag;
        }

        public Usuario iniciarSesion(string nombreUsuario, string password)
        {
            Usuario usuario = new Usuario();
            try
            {
                var db = new Bd_tesisDataContext();
                var query = from c in db.Usuario
                            where c.nombre_usuario == nombreUsuario 
                            select c;

                query = query.Where(x => x.contrasenha_nueva == password);

                List<Usuario> usuarios = query.ToList();
                if (usuarios.Count() > 0)
                {
                    usuario = usuarios.First();
                }

            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            return usuario;
        }

        public void setSesionActiva(Usuario usuario)
        {
            var db = new Bd_tesisDataContext();
            Usuario user = db.Usuario.Single(u => u.nombre_usuario == usuario.nombre_usuario);
            user.sesion = 1;
            try
            {
                db.SubmitChanges();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }

        public void setSesionInactiva(Usuario usuario)
        {
            var db = new Bd_tesisDataContext();
            Usuario user = db.Usuario.Single(u => u.nombre_usuario == usuario.nombre_usuario);
            user.sesion = 0;
            try
            {
                db.SubmitChanges();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }

        public PerfilPersonal buscarPersonalxId(int perfil_personal_id)
        {
            var db = new Bd_tesisDataContext();
            PerfilPersonal personal = new PerfilPersonal();
            try
            {
                var query = from c in db.PerfilPersonal
                            where c.id == perfil_personal_id
                            select c;

                personal = query.First();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            return personal;
        }

        public string cambiarContraseña(Usuario usuario, string antiguaContrasenha, string nuevaContraseña, string confirmacion_nuevaContrasenha)
        {
            string resultado = null;
            try
            {
                if (usuario.contrasenha_antigua == antiguaContrasenha)
                {
                    if ((nuevaContraseña == confirmacion_nuevaContrasenha) && (nuevaContraseña != "") && (confirmacion_nuevaContrasenha != ""))
                    {
                        var db = new Bd_tesisDataContext();
                        Usuario user = db.Usuario.Single(u => u.nombre_usuario == usuario.nombre_usuario);
                        user.contrasenha_antigua = antiguaContrasenha;
                        user.contrasenha_nueva = nuevaContraseña;
                        try
                        {
                            db.SubmitChanges();
                            resultado = CAMBIO_CONTRASENHA_CORRECTO;
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine(e.ToString());
                        }
                    }
                    else
                    {
                        resultado = CONFIRMACION_CONTRASENHA_INCORRECTA;
                    }
                }
                else
                {
                    resultado = CONTRASENHA_INCORRECTA;
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            return resultado;
        }

        public string cambiarContrasenhaOlvido(Usuario user)
        {
            string resultado = null;
            try
            {
                var db = new Bd_tesisDataContext();
                db.SubmitChanges();
                resultado = CONTRASENHA_OLVIDO_CORRECTO;

            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            return resultado;
        }


        public bool actualizarUsuario(int personal_id, string usuario, string nombres, string apellido_paterno, string apellido_materno, DateTime fecha_nacimiento, string direccion, string telefono, string correo, int perfil_id, int turno)
        {
            bool resultado = false;
            try
            {
                var db = new Bd_tesisDataContext();

                PerfilPersonal personal = db.PerfilPersonal.Single(u => u.id == personal_id);
                Usuario user = personal.Usuario;

                user.nombre_usuario = usuario;
                personal.nombre = nombres;
                personal.ap_paterno = apellido_paterno;
                personal.ap_materno = apellido_materno;
                personal.fecha_nac = fecha_nacimiento;
                personal.direccion = direccion;
                personal.telefono = telefono;
                personal.correo = correo;
                personal.turno = turno;
                user.perfil_id = perfil_id;

                db.SubmitChanges();

                resultado = true;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
            return resultado;
        }

        public bool eliminarPerfilPersonal(int personal_id)
        {
            bool resultado = false;

            try
            {
                var db = new Bd_tesisDataContext();

                PerfilPersonal personal = db.PerfilPersonal.Single(u => u.id == personal_id);

                personal.estado = "Inactivo";

                db.SubmitChanges();

                resultado = true;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }

            return resultado;
        }

        public List<Resource> obtenerRecursos()
        {
            List<Resource> listaRecursos = new List<Resource>();

            try
            {
                var db = new Bd_tesisDataContext();

                Perfil perfil = perfilController.buscarPerfilxNombre("Controlador Aéreo");

                var query = from pp in db.PerfilPersonal
                            where pp.Usuario.perfil_id == perfil.id
                            select pp;

                List<PerfilPersonal> listaPerfilPersonal = query.ToList();

                foreach (PerfilPersonal perfilPersonal in listaPerfilPersonal)
                {
                    Resource recurso = new Resource();
                    recurso.Id = new EventId(perfilPersonal.id);
                    recurso.Name = perfilPersonal.nombre + " " + perfilPersonal.ap_paterno + " " + perfilPersonal.ap_materno;

                    listaRecursos.Add(recurso);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }

            return listaRecursos;
        }

        public List<Usuario> cargarControladores()
        {
            List<Usuario> listaUsuario = new List<Usuario>();

            try
            {
                var db = new Bd_tesisDataContext();

                Perfil perfil = perfilController.buscarPerfilxNombre("Controlador Aéreo");

                var query = from u in db.Usuario
                            where u.perfil_id == perfil.id
                            select u;

                listaUsuario = query.ToList();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }

            return listaUsuario;
        }

        public int buscarTurno(int usuario_id)
        {
            int turno = 0;
            try
            {
                var db = new Bd_tesisDataContext();

                var query = from p in db.PerfilPersonal
                            where p.usuario_id == usuario_id
                            select p;

                turno = Convert.ToInt32(query.First().turno);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }

            return turno;
        }
    }
}
